import axios from 'axios'

// 定义Loki服务的基础URL，实际项目中应该从环境变量或配置文件中获取
const LOKI_API_BASE_URL = 'http://192.168.123.242:3100'  // 默认Loki端口

// 定义命名空间数据结构
interface Namespace {
  name: string
  pods: string[]
}

// 定义日志查询参数
interface LogQueryParams {
  namespace: string
  pod: string
  startTime: string
  endTime: string
  keyword: string
}

/**
 * Loki服务类，提供与Loki API交互的方法
 */
class LokiService {
  /**
   * 获取所有命名空间和Pod数据
   * 注意：这里模拟返回数据，实际项目中应该从API获取
   */
  async getNamespaces(): Promise<Namespace[]> {
    // 在实际项目中，这里应该调用API获取数据
    
    // 模拟数据，实际项目中应替换为真实API调用
    return [
      {
        name: 'default',
        pods: ['deeparena-docs-9b54874c9-lphh8', 'comfyui-6678d5f755-l4p5w']
      },
      {
        name: 'deeparena',
        pods: ['deeparena-notif-5d6dcdd675-d2zf2', 'deeparena-scheduler-65bb874d49-xr22n']
      }
    ];
  }

  /**
   * 查询日志
   * @param params 日志查询参数
   */
  async queryLogs(params: LogQueryParams): Promise<string[]> {
    try {
      // 构建Loki查询表达式
      const logQLQuery = this.buildLogQLQuery(params);
      
      // 在实际项目中，这里应该调用Loki API查询日志
      // 例如：
      const response = await axios.get(`${LOKI_API_BASE_URL}/loki/api/v1/query_range`, {
        params: {
          query: logQLQuery,
          start: params.startTime,
          end: params.endTime,
          limit: 1000,
          direction: 'backward'
        }
      });
      return this.processLokiResponse(response.data);
      
      // 模拟日志数据，实际项目中应替换为真实API调用
      // return this.generateMockLogs(params);
    } catch (error) {
      console.error('查询日志失败:', error);
      throw error;
    }
  }

  /**
   * 构建LogQL查询表达式
   * @param params 日志查询参数
   */
  private buildLogQLQuery(params: LogQueryParams): string {
    // 基础标签选择器
    let query = `{namespace="${params.namespace}", pod="${params.pod}"}`;
    
    // 添加关键词过滤
    if (params.keyword && params.keyword.trim() !== '') {
      query += ` |= "${params.keyword}"`;
    }
    
    return query;
  }

  /**
   * 处理Loki API响应
   * 注意：这是实际项目中处理Loki响应的示例方法
   */
  private processLokiResponse(responseData: any): string[] {
    const logs: string[] = [];
    
    if (responseData && responseData.data && responseData.data.result) {
      for (const stream of responseData.data.result) {
        for (const [timestamp, value] of stream.values) {
          const time = new Date(timestamp / 1000000).toISOString();
          logs.push(`[${time}] ${value}`);
        }
      }
    }
    
    return logs;
  }

  /**
   * 生成模拟日志数据
   * 注意：仅用于演示，实际项目中应删除此方法
   */
  private generateMockLogs(params: LogQueryParams): string[] {
    const logs: string[] = [];
    const logCount = Math.floor(Math.random() * 50) + 10; // 生成10-60条日志
    
    const startTime = new Date(params.startTime);
    const endTime = new Date(params.endTime);
    const timeRange = endTime.getTime() - startTime.getTime();
    
    const logTypes = [
      'INFO',
      'WARN',
      'ERROR',
      'DEBUG'
    ];
    
    const logMessages = [
      '应用启动完成',
      '处理请求',
      '数据库连接成功',
      '缓存已刷新',
      '用户认证成功',
      '资源加载完成',
      '会话已过期',
      '连接超时',
      '内存使用率过高',
      '磁盘空间不足',
      '网络连接断开',
      '配置已更新'
    ];
    
    // 如果有关键词，确保部分日志包含该关键词
    if (params.keyword && params.keyword.trim() !== '') {
      logMessages.push(`包含关键词 ${params.keyword} 的日志消息`);
      logMessages.push(`发现匹配项: ${params.keyword}`);
      logMessages.push(`搜索结果: ${params.keyword} 已找到`);
    }
    
    for (let i = 0; i < logCount; i++) {
      // 生成随机时间戳
      const randomTime = new Date(startTime.getTime() + Math.random() * timeRange);
      const timeStr = randomTime.toISOString();
      
      // 随机选择日志类型和消息
      const logType = logTypes[Math.floor(Math.random() * logTypes.length)];
      let logMessage = logMessages[Math.floor(Math.random() * logMessages.length)];
      
      // 添加一些随机细节
      if (logType === 'INFO' || logType === 'DEBUG') {
        logMessage += ` (pid=${Math.floor(Math.random() * 10000)}, thread=${Math.floor(Math.random() * 100)})`;
      } else if (logType === 'ERROR') {
        logMessage += ` - 错误代码: E${Math.floor(Math.random() * 1000)}`;
      }
      
      // 构建完整日志行
      const log = `[${timeStr}] [${params.namespace}/${params.pod}] [${logType}] ${logMessage}`;
      logs.push(log);
    }
    
    // 按时间排序
    logs.sort();
    
    return logs;
  }
}

export const lokiService = new LokiService();